#find_package包含第三方库

cmake_minimum_required(VERSION 3.10)
project(course_05)

#第一种方法
#find_package的Module模式,不加任何参数默认就是Module模式
#[[
    在Module模式下，其实是在找FindOpenCV.cmake文件，查找路径是/usr/share/cmake-3.25/Modules。Find<LibaryName>.cmake文件是CMake官方给我们提供的，它只支持一些特别常见的库
]]

find_package(Protobuf) # 包含第三方库
if(Protobuf_FOUND)
    message(STATUS "Protobuf found")
    message(STATUS ${Protobuf_FOUND})#库名_关键字 是一些预制变量
    message(STATUS ${Protobuf_INCLUDE_DIR})
    message(STATUS ${Protobuf_INCLUDES})
    message(STATUS ${Protobuf_LIBRARY})
    message(STATUS ${Protobuf_LIBRARIES})
else()
    message(WARNING "Protobuf not  found")
endif()

#第二种方法
#find_package的config模式
#[[
    CONFIG模式实际是在/usr/local/lib/cmake下查找对应的<LibaryName>config.cmake文件。
]]
find_package(OpenCV CONFIG)

set(CMAKE_CXX_STANDARD 11)  # 将 C++ 标准设置为 C++ 11
set(CMAKE_CXX_STANDARD_REQUIRED ON)  # C++ 11 是强制要求，不会衰退至低版本
set(CMAKE_CXX_EXTENSIONS OFF)  # 禁止使用编译器特有扩展

if(NOT CMAKE_BUILD_TYPE)
    message(WARNING "NOT SET CMAKE_BUILD_TYPE")
    set(CMAKE_BUILD_TYPE "Release")
endif()

#使用aux_source_directory获取所有源文件,src 目录
aux_source_directory(src SRC)
message("SRC内容是->${SRC}" )#SRC内容 src/add.cpp;src/main.cpp;src/sub.cpp
#设置头文件路径
set(INCLUDE "include")

add_library(my_math)
target_sources(my_math PRIVATE ${SRC}) #设置源文件

target_include_directories(my_math PUBLIC ${INCLUDE}) #设置头文件

add_executable(run test/main.cpp)
target_link_libraries(run my_math protobuf::libprotobuf)

#CMAKE_INSTALL_PREFIX 设置CMAKE构建过程中的安装路径，默认为 /usr/local
set(CMAKE_INSTALL_PREFIX ${CMAKE_CURRENT_SOURCE_DIR}/install/)

#安装run和my_math两个目标
install(TARGETS 
            run my_math
            RUNTIME DESTINATION bin  #RUNTIME表示可执行文件被安装到bin目录下
            LIBRARY DESTINATION lib) #LIBRARY表示静态库会被安装在lib下
                                     #这里的目标都是相对路径，相对于 CMAKE_INSTALL_PREFIX

#安装头文件
install(FILES 
                include/my_math.hpp DESTINATION my_math/include)# 将my_math.hpp安装到${CMAKE_INSTALL_PREFIX}/my_math/include

#命令行使用下列命令，进行安装步骤
#cmake --install /root/Learn/cmakeStudy/build --prefix /root/Learn/cmakeStudy/install

#[[

#预制第三方库的变量
#根据这些变量，可以设置对应头文件和库，来链接到自己的项目里。

    <LibaryName>_FOUND
    <LibaryName>_INCLUDE_DIR 
    <LibaryName>_INCLUDES
    <LibaryName>_LIBRARY
    <LibaryName>_LIBRARIES
]]

#学习来源：https://zhuanlan.zhihu.com/p/655302131